/* 转换流，
类的继承方式
Reader
|__ BufferedReader、StringReader、InputStreamReader
                                      |__ FileReader

Writer
|__ BufferedWriter、StringWriter、OutputStreamWriter
                                      |__ FileWriter
有时会遇到麻烦的问题，读取的是一个字符串或一个个字符，但要往一个只支持byte类型的OutputStream里输出，
要往里面写入内容，进行数据转换比较麻烦，有没有更简便的方法？

InputSteamReader 是字符流Reader的子类，是字节流通向字符流的桥梁。你可以在构造器中指定编码方式，不指定则使用操作系统默认编码方式。
要启用从字节到字符的有效转换，可以提前从底层流读取更多字节，使其超过满足当前读取操作所需的字节。一次只读一个字符。
OutputStreamWriter是字符流Writer的子类，是字符流通向字节流的桥梁，每次调用writer方法都会导致在给定字符或字符集上调用编码转换器。
在写入底层输出流之前，得到的这些字节将在缓冲区中累积，一次只写一个字符
 */
package javaio.InputStreamReaderOutputStreamWriter;

import java.io.*;

public class Main {
    public static void main(String[] args) {
        try(OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("output.txt"));
            //虽热给定的是FileOutputStream，但是现在支持以Writer的方式进行写入
            InputStreamReader reader = new InputStreamReader(new FileInputStream("test.txt"))){
            //给定的是FileInputStrea，但现在支持以Reader的方式进行读取
            writer.write("lbwnb");  //以操作Writer的样子写入OutputStream
            System.out.println((char) reader.read());  //以操作Reader的样子读取InputStream
        }catch (IOException e){
            e.printStackTrace();
        }
        //通过转换流，可以方便的在字节流和字符流之间转换。InputStreamReader和OutputStream本质上也是Reader和Writer，
        // 因此可以直接放入BufferedReader和BufferedWriter来实现更加方便的操作，下面套一个BufferedStream

        try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("output.txt")));
            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt")))){
            System.out.println(reader.readLine());  //支持了缓冲字符流的readLine()
        }catch (IOException e){
            e.printStackTrace();
        }

    }
}
